/**
 * @file LogFile.h
 * @brief 日志文件管理，支持日志轮转
 * @author Enterprise Logger Team
 * @date 2024
 */

#ifndef LOGGER_LOGFILE_H
#define LOGGER_LOGFILE_H

#include <string>
#include <memory>
#include <mutex>
#include <fstream>
#include <chrono>

namespace logger {

// 前向声明
class FileUtil;

/**
 * @brief 日志文件类
 * 负责文件写入和日志轮转
 */
class LogFile {
public:
    LogFile(const std::string& basename,
            size_t rollSize,
            bool threadSafe = true,
            int flushInterval = 3,
            int checkEveryN = 1024);
    ~LogFile();

    // 追加日志
    void append(const char* logline, int len);
    
    // 刷新缓冲区
    void flush();
    
    // 滚动日志文件
    bool rollFile();

    // 获取已写入字节数
    size_t writtenBytes() const { return writtenBytes_; }

private:
    // 禁用拷贝
    LogFile(const LogFile&) = delete;
    LogFile& operator=(const LogFile&) = delete;

    // 不加锁的追加（内部使用）
    void append_unlocked(const char* logline, int len);

    // 获取日志文件名
    static std::string getLogFileName(const std::string& basename, time_t* now);

    // 成员变量
    const std::string basename_;     // 基础文件名
    const size_t rollSize_;          // 滚动大小
    const int flushInterval_;        // 刷新间隔
    const int checkEveryN_;          // 每N次检查是否需要滚动

    int count_;                      // 写入计数器
    std::unique_ptr<std::mutex> mutex_;  // 互斥锁（可选）
    
    // 文件相关
    std::unique_ptr<FileUtil> file_;  // 文件工具
    size_t writtenBytes_;            // 已写入字节数
    
    // 时间相关
    time_t startOfPeriod_;          // 当前周期开始时间
    time_t lastRoll_;                // 上次滚动时间
    time_t lastFlush_;               // 上次刷新时间
    
    // 静态常量
    static const int kRollPerSeconds_ = 60 * 60 * 24;  // 一天
};

/**
 * @brief 文件工具类
 */
class FileUtil {
public:
    explicit FileUtil(const std::string& filename);
    ~FileUtil();

    // 追加内容
    void append(const char* logline, size_t len);
    
    // 刷新
    void flush();
    
    // 获取已写入字节数
    size_t writtenBytes() const { return writtenBytes_; }

private:
    size_t write(const char* logline, size_t len);

    std::ofstream file_;
    char buffer_[64 * 1024];  // 64KB缓冲区
    size_t writtenBytes_;
};

}  // namespace logger

#endif  // LOGGER_LOGFILE_H
